//package com.ruoyi.system.interceptor;
//
//import com.baomidou.mybatisplus.core.mapper.BaseMapper;
//import com.ruoyi.common.core.domain.entity.SysUser;
//import com.ruoyi.common.utils.SecurityUtils;
//import com.ruoyi.system.domain.SysDataChangeLog;
//import com.ruoyi.system.mapper.SysDataChangeLogMapper;
//import com.ruoyi.system.utils.FieldFormatUtils;
//import com.ruoyi.system.utils.SpringContextUtils;
//import org.apache.ibatis.executor.Executor;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.mapping.SqlCommandType;
//import org.apache.ibatis.plugin.*;
//import org.springframework.stereotype.Component;
//import java.lang.reflect.Field;
//import java.lang.reflect.Method;
//import java.util.Date;
//import java.util.List;
//import java.util.Properties;
//
///**
// * 拦截插入操作，获取插入后的完整数据
// */
//@Component
//@Intercepts({@Signature(
//    type = Executor.class,
//    method = "update",
//    args = {MappedStatement.class, Object.class}
//)})
//public class InsertDataCaptureInterceptor implements Interceptor {
//
//    private SysDataChangeLogMapper changeLogMapper;
//
//    @Override
//    public Object intercept(Invocation invocation) throws Throwable {
//        // 延迟初始化Mapper解决循环依赖
//        if (changeLogMapper == null) {
//            changeLogMapper = SpringContextUtils.getBean(SysDataChangeLogMapper.class);
//        }
//
//        MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
//        Object parameter = invocation.getArgs()[1];
//        SqlCommandType commandType = ms.getSqlCommandType();
//
//        // 执行插入操作前的准备
//        String tableName = getTableName(parameter);
//        Class<?> entityClass = getEntityClass(parameter);
//
//        // 执行原始插入操作
//        Object result = invocation.proceed();
//
//        // 只处理插入操作
//        if (commandType == SqlCommandType.INSERT) {
//            // 1. 获取插入后的主键ID
//            Object primaryKey = getPrimaryKeyValue(parameter);
//            if (primaryKey == null) {
//                return result;
//            }
//
//            // 2. 查询插入后的完整数据
//            Object insertedData = queryInsertedData(entityClass, primaryKey);
//            if (insertedData == null) {
//                return result;
//            }
//
//            // 3. 记录插入数据的所有字段
//            recordInsertData(tableName, primaryKey.toString(), insertedData);
//        }
//
//        return result;
//    }
//
//    /**
//     * 获取实体类对应的表名（基于MyBatis-Plus注解）
//     */
//    private String getTableName(Object parameter) {
//        try {
//            Class<?> entityClass = getEntityClass(parameter);
//            com.baomidou.mybatisplus.annotation.TableName tableAnn =
//                entityClass.getAnnotation(com.baomidou.mybatisplus.annotation.TableName.class);
//            return tableAnn != null ? tableAnn.value() : entityClass.getSimpleName();
//        } catch (Exception e) {
//            return "unknown_table";
//        }
//    }
//
//    /**
//     * 获取实体类类型（处理包装类）
//     */
//    private Class<?> getEntityClass(Object parameter) {
//        if (parameter instanceof List) {
//            List<?> list = (List<?>) parameter;
//            if (!list.isEmpty()) {
//                return list.get(0).getClass();
//            }
//        }
//        return parameter.getClass();
//    }
//
//    /**
//     * 获取插入后的主键值
//     */
//    private Object getPrimaryKeyValue(Object parameter) throws Exception {
//        Object entity = parameter;
//
//        // 处理批量插入的情况
//        if (parameter instanceof List) {
//            List<?> list = (List<?>) parameter;
//            if (!list.isEmpty()) {
//                entity = list.get(0); // 只处理第一条记录的主键
//            }
//        }
//
//        // 查找主键字段（支持@TableId注解）
//        Field[] fields = entity.getClass().getDeclaredFields();
//        for (Field field : fields) {
//            if (field.isAnnotationPresent(com.baomidou.mybatisplus.annotation.TableId.class)) {
//                field.setAccessible(true);
//                return field.get(entity);
//            }
//        }
//
//        // 默认查找id字段
//        try {
//            Field idField = entity.getClass().getDeclaredField("id");
//            idField.setAccessible(true);
//            return idField.get(entity);
//        } catch (NoSuchFieldException e) {
//            return null;
//        }
//    }
//
//    /**
//     * 查询插入后的完整数据
//     */
//    private Object queryInsertedData(Class<?> entityClass, Object primaryKey) {
//        try {
//            // 构建Mapper类名（若依规范：实体类对应Mapper为XxxMapper）
//            String packageName = entityClass.getPackage().getName();
//            String mapperPackage = packageName.replace("domain", "mapper");
//            String entityName = entityClass.getSimpleName();
//            String mapperClassName = mapperPackage + "." + entityName + "Mapper";
//
//            // 加载Mapper类并获取实例
//            Class<?> mapperClass = Class.forName(mapperClassName);
//            BaseMapper<?> mapper = (BaseMapper<?>) SpringContextUtils.getBean(mapperClass);
//
//            // 调用selectById方法查询
//            Method selectMethod = mapperClass.getMethod("selectById", Object.class);
//            return selectMethod.invoke(mapper, primaryKey);
//        } catch (Exception e) {
//            // 记录日志：查询插入后数据失败
//            return null;
//        }
//    }
//
//    /**
//     * 记录插入数据的所有字段
//     */
//    private void recordInsertData(String tableName, String recordId, Object insertedData) {
//        // 获取当前操作用户
//        String operateBy = "system";
//        try {
//            SysUser user = SecurityUtils.getLoginUser().getUser();
//            if (user != null) {
//                operateBy = user.getUserName();
//            }
//        } catch (Exception e) {
//            // 匿名插入场景
//        }
//
//        // 获取所有字段及值
//        List<FieldFormatUtils.FieldValue> fieldValues =
//            FieldFormatUtils.getObjectFields(insertedData);
//
//        // 保存到变更日志表
//        for (FieldFormatUtils.FieldValue field : fieldValues) {
//            SysDataChangeLog log = new SysDataChangeLog();
//            log.setTableName(tableName);
//            log.setRecordId(recordId);
//            log.setOperateType("insert");
//            log.setFieldName(field.getFieldName());
//            log.setNewValue(field.getFieldValue());
//            log.setOperateTime(new Date());
//            log.setOperateBy(operateBy);
//            changeLogMapper.insert(log);
//        }
//    }
//
//    @Override
//    public Object plugin(Object target) {
//        return Plugin.wrap(target, this);
//    }
//
//    @Override
//    public void setProperties(Properties properties) {
//        // 可配置忽略的表或字段
//    }
//}
//